package com.longchat.service.impl.award;

import java.util.ArrayList;
import java.util.List;

import javax.transaction.Transactional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.longchat.domain.award.Option;
import com.longchat.domain.award.Questionnaire;
import com.longchat.domain.award.Questionnaire.QuestionnarireType;
import com.longchat.domain.award.VoteLog;
import com.longchat.dto.comm.DatatablesPageViewInfo;
import com.longchat.dto.comm.ResultEnum;
import com.longchat.dto.comm.ResultInfo;
import com.longchat.dto.vote.VoteDataTablesQueryInfo;
import com.longchat.query.VoteQuery;
import com.longchat.repository.OptionJpaRepository;
import com.longchat.repository.QuestionnaireJpaRepository;
import com.longchat.repository.VoteLogJpaRepository;
import com.longchat.service.inter.award.IQuestionnaireService;

@Service
public class QuestionnaireService implements IQuestionnaireService {

	private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(QuestionnaireService.class);
	@Autowired
	private QuestionnaireJpaRepository questionnaireJpaRepository;
	@Autowired
	private OptionJpaRepository optionJpaRepository;
	@Autowired
	private VoteLogJpaRepository voteLogJpaRepository;
	@Autowired
	private VoteQuery voteQuery;
	@Override
	public Questionnaire findById(Integer id) {
		return questionnaireJpaRepository.findOne(id);
	}
	@Transactional
	@Override
	public ResultInfo vote(String openid,Integer questionnaireid,Integer optionid) {
		Questionnaire questionnaire = questionnaireJpaRepository.findOne(questionnaireid);
		if(questionnaire==null){
			logger.error("questionnaireid==>{}没有找到对应的问题",questionnaireid);
			return new ResultInfo(ResultEnum.ERROR);
		}
		VoteLog log = voteLogJpaRepository.findByOpenid(openid,questionnaireid);
		if(questionnaire.getType().equals(QuestionnarireType.SIGNLE)){
			if(log!=null){
				logger.info("optionid vote==>{}已存在",optionid);
				return new ResultInfo(ResultEnum.HAS_VOTE);
			}
		}else{
			VoteLog checklog = voteLogJpaRepository.findCheckByOpenid(openid,questionnaireid,optionid);
			if(checklog!=null){
				logger.info("optionid vote==>{}已存在",optionid);
				return new ResultInfo(ResultEnum.HAS_CHECK_VOTE);
			}
		}
		Option option = optionJpaRepository.findOne(optionid);
		if(option==null){
			logger.error("optionid==>{}没有找到对应的选项",optionid);
			return new ResultInfo(ResultEnum.ERROR);
		}
		VoteLog voteLog =null;
		if(log==null){
			 voteLog= new VoteLog();
		}else{
			voteLog = log;
		}
		voteLog.setOpenid(openid);
		List<Option> options = voteLog.getOptions();
		options.add(option);
		voteLog.setOptions(options);
		voteLog.setQuestionnarire(questionnaire);
		if(log==null){
			questionnaire.setTotalVoters(questionnaire.getTotalVoters()+1);
		}
		List<Option> queryOptions = questionnaire.getOptions();
		for(Option o:queryOptions){
			if(o.getId()==option.getId()){
				o.setTotalSelector(o.getTotalSelector()+1);
			}
			double percent = (double) (o.getTotalSelector()*10000/questionnaire.getTotalVoters())/100;
			o.setTotalPercent(percent);
		}
		optionJpaRepository.save(queryOptions);
		voteLogJpaRepository.save(voteLog);
		
		return new ResultInfo(ResultEnum.SUCCESS,questionnaire);
	}
	@Override
	public DatatablesPageViewInfo<Questionnaire> findPageBy(VoteDataTablesQueryInfo info) {
		return voteQuery.findPageBy(info);
	}
	@Override
	public ResultInfo addQuestionnaire(Questionnaire question) {
		questionnaireJpaRepository.save(question);
		 return new ResultInfo(ResultEnum.SUCCESS);
	}
	@Override
	public ResultInfo maintainOptions(List<Option> options, Integer questionid) {
		Questionnaire questionnaire = questionnaireJpaRepository.findOne(questionid);
		if(questionnaire==null){
			logger.error("根据questionid==>{}，找到question为空",questionid);
			return new ResultInfo(ResultEnum.ERROR);
		}
		for(Option o:options){
			o.setQuestionnaire(questionnaire);
		}
		optionJpaRepository.save(options);
		return new ResultInfo(ResultEnum.SUCCESS);
	}
	@Override
	public ResultInfo updateQuestionnaire(Questionnaire question) {
		questionnaireJpaRepository.save(question);
		 return new ResultInfo(ResultEnum.SUCCESS);
	}
	@Override
	public ResultInfo deleteQuestionnaire(Integer id) {
		 questionnaireJpaRepository.delete(id);
		 return new ResultInfo(ResultEnum.SUCCESS);
	}
	@Override
	public List<Option> findOptionsBy(Integer questionnaireId) {
		return optionJpaRepository.findByQuestionid(questionnaireId);
	}
	@Transactional
	@Override
	public ResultInfo saveOptions(Integer questionid, List<String> options) {
		Questionnaire questionnaire = questionnaireJpaRepository.findOne(questionid);
		List<Option> qesoptions = new ArrayList<Option>();
		for(int i=0;i<options.size();i++){
			Option o = new Option();
			o.setName(options.get(i));
			o.setSeq(i);
			o.setQuestionnaire(questionnaire);
			qesoptions.add(o);
		}
		List<Option> originalOptions = optionJpaRepository.findByQuestionid(questionid);
		optionJpaRepository.delete(originalOptions);
	   optionJpaRepository.save(qesoptions);
	   return new ResultInfo(ResultEnum.SUCCESS);
	}

}
